#pragma once

#include "SkeletalBase.h"
#include "cocos2d.h"

//////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 类：  CAnimation
//
// 功能：用于动画的控制和管理
//
// 主要功能介绍：
//
//		   一，外部接口：LoadXFile： 从.X文件中加载动画信息，pFileName为ANSI的文件名，pMapMesh为与之
//                 关联的网格，如果指定，动画和网格需来自同一个文件；
//
//                       SetLoop：来设定将某个动画设置成循环模式，动画集的标识为ANSI的字符串，如果设置
//                成了循环，则每次更新时，时间将会进行取余操作，进行插值更新动画
//                  
//                       SetCurAnimSet：用来指定当前需要更新的动画集UpdateCurAnim就更新此动画集
//						
//                       UpdateCurAnim：更新指定的CurAnimSet的全部的矩阵信息，如果关联的Frame，此更新信息
//                将更新到Frame中
//
//////////////////////////////////////////////////////////////////////////////////////////////////////

class CSkeletalLayer;

class CAnimation
{
public:
    
	CAnimation()
    : m_pAnimSet(NULL)
    , m_nAnimSets(0)
    , m_pParentFrame(NULL)
	{
        
	}
    
    ~CAnimation()
    {
        if(NULL != m_pAnimSet)
        {
            delete m_pAnimSet;
            m_pAnimSet = NULL;
        }
        
        if(NULL != m_pParentFrame)
        {
            delete m_pParentFrame;
            m_pParentFrame = NULL;
        }
        
        m_nAnimSets = 0;
    }
    
	bool LoadFromFile(const char *pFileName, CSkeletalLayer *pParent);
	virtual void destroy();
    
	bool SetLoop(const char *pAnimSetName, bool bLoop);
	void UpdateAnimSet(AnimationSet *pAnimSet, unsigned long time, bool bSmooth);
	AnimationSet *GetAnimSet(const char *pAnimSetName);
    
	long GetLength(const char *pName);
    
    virtual void animationEnd(const char *szSetName){}
protected:
    
	void _ResetFrame(Frame *pFrame);
	void _UpdateFrame(Frame *pFrame,const Matrix4X3 &mat, bool bTransformed);
	
	AnimationSet *_FindAnimSet(AnimationSet *pAnimSet, const char *pAnimName);
	//void _ParseXFileData(ID3DXFileData *pDXData, AnimationSet *pParentSet, Animation *pCurAnim);
	//bool _MapToMesh(CMesh *pMesh);
	void _UpdateAnimation(Animation *pAnim, unsigned long time, bool  bSmooth);
    
	//AnimationSet *_FindAnimSet(AnimationSet *pAnimSet, const char *pAnimName);
    
protected:
    
	AnimationSet  *m_pAnimSet;
	unsigned long  m_nAnimSets;			// 动画集数量
    
	Frame         *m_pParentFrame;
    
    
};

class CSkeletalLayer : public cocos2d::CCLayer, public CAnimation
{
public:
	LAYER_NODE_FUNC(CSkeletalLayer);
private:
	
public:
	
	CSkeletalLayer(void);
    
    virtual void onExit();
    virtual void destroy();
    virtual void animationChange() {}
    
	bool SetAnimation(const char *pAnimName, unsigned long startTime);
	void ResetAnimation(unsigned long time);
	void UpdateAnimation(unsigned long curTime, bool bSmooth);
    
protected:
    
	AnimationSet *m_pCurAnimSet;		// 临时存储，不用释放
	unsigned long m_startTime;
    unsigned long m_curTime;
	bool          m_bLoaded;
};
